现在有两个没有关联的文件a.list,b.list
$ cat a.list
abc ABC
def DEF
ghi GHI
$ cat b.list
1
2
3
现在希望将a.list 、b.list两个文合并如下:
abc ABC 1
def DEF 2
ghi GHI 3
命令:awk 'NR==FNR{a[NR]=$0;nr=NR;}NR>FNR{print a[NR-nr], $0}' a.list b.list
NR:awk 处理的当前的行数,从1开始,直到所有文件处理完
FNR:awk 处理的当前行在当前文件中所在的行数,从1开始,直到当前这个文件处理完,且在下一个文件会重新计数
NR==FNR:表示当在处理第一个文件时
a[NR]=$0:表示建立一个数组a,每行的行号和改行的内容形成一一对应的关系nr=NR:这里用nr这个变量记录第一个文件的行数;每处理一行nr被刷新一次,直到第一个文件结尾,最后nr就是第一个文件的行数!
NR>FNR:表示处理第二个文件时
a[NR-nr]:表示第一个文件的内容
$0:表示第二个文件
的每行的所有内容
当要这样处理两个以上的文件时,可以递归处理
另附一个文本内容去重awk脚本:
awk '!a[$0]++' FILE
!:表示取反
a[$0]:表示以每行所有内容分别和自然数0,1,2,3…形成二维数组;也可以针对某个块比如$1,$2
++:表示对重复的内容进行计数再附一个按列求和的awk脚本:
awk 'BEGIN {sum = 0}; {sum += $1};END {print sum}'